<?php

declare(strict_types=1);

namespace app;


use think\Model;

/**
 * 控制器基础类
 */
abstract class BaseModel extends Model
{
    /**
     * 获取模型字段及默认值
     * 所有继承此类的模型都可以调用此方法获取字段信息
     */
    public static function getDefaultFields($array = [])
    {
        $model = new static();
        // 使用框架自带的方法获取字段
        $fields = $model->getTableFields();
        $defaultValues = [];

        foreach ($fields as $field) {
            $defaultValues[$field] = $model->getFieldDefaultValue($field);
        }

        return array_merge($defaultValues, $array);
    }

    /**
     * 获取字段默认值
     * 子类可以重写此方法以提供特定的默认值
     */
    protected function getFieldDefaultValue($field)
    {
        // 尝试从数据库获取字段的默认值
        try {
            $dbName = $this->getConfig('database');
            $table = $this->getTable();
            $sql = "SELECT COLUMN_NAME, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?";
            $result = $this->db()->query($sql, [$dbName, $table]);

            foreach ($result as $row) {
                if ($row['COLUMN_NAME'] == $field) {
                    return $row['COLUMN_DEFAULT'];
                }
            }
        } catch (\Exception $e) {
            // 如果查询失败，使用通用默认值
        }

        return $defaults[$field] ?? null;
    }

    /**
     * 处理ISO日期时间格式转换为日期格式
     * 
     * @param string|null $isoDate ISO格式的日期时间字符串
     * @return string|null 转换后的日期字符串 (Y-m-d格式) 或 null
     */
    public static function convertIsoToDate($isoDate)
    {
        if (empty($isoDate)) {
            return null;
        }

        // 如果是ISO格式的日期时间字符串，转换为日期格式
        if (strpos($isoDate, 'T') !== false) {
            try {
                $date = new \DateTime($isoDate);
                return $date->format('Y-m-d');
            } catch (\Exception $e) {
                // 如果转换失败，返回原始值
                return $isoDate;
            }
        }

        // 如果已经是日期格式，直接返回
        return $isoDate;
    }
    public static function processDateFields($data, $dateFields)
    {
        foreach ($dateFields as $field) {
            if (isset($data[$field])) {
                $data[$field] = self::convertIsoToDate($data[$field]);
            }
        }
        return $data;
    }
}
